home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0045 / spritsrc.exe / SPRITLIB.BAK < prev    next >
Text File  |  1991-08-30  |  12KB  |  390 lines

  1. unit spritlib;          {Sprite-Library für Turbo Pascal V1.2 vom 29.01.1991}
  2.  
  3. interface
  4. uses graph;
  5.  
  6. const max_sprites=12;   {Maximalzahl der Sprites, die benutzt werden können}
  7.  
  8. type    kollision_feld_typ = array [0..max_sprites-1] of boolean;
  9.         sprite_feld_record = record
  10.                              frei   : boolean;
  11.                              x_gr   : byte;
  12.                              y_gr   : byte;
  13.                              o_nr   : byte;
  14.                              e_merk : word;
  15.                              m_merk : word;
  16.                              x_pos  : word;
  17.                              y_pos  : word;
  18.                              memuse : word;
  19.                              datenp : pointer;
  20.                              savep  : pointer;
  21.                              o_list : array [0..max_sprites-1] of byte;
  22.                              s_list : array [0..max_sprites-1] of byte;
  23.                           end;
  24.  
  25. var  sprite_error   : integer;
  26.      init_count     : integer;
  27.      sprite_daten   : array [0..1027] of byte;
  28.      sprite_feld    : array [0..max_sprites-1] of sprite_feld_record;
  29.      hide_list      : array [0..max_sprites-1] of byte;
  30.      kol_list       : kollision_feld_typ;
  31.      n_image_size   : integer;
  32.  
  33. procedure load_sprite (fname : string ; var nummer : integer);
  34. procedure unload_sprite (nummer : integer);
  35. procedure show_sprite (n,x,y,e,m : integer);
  36. procedure hide_sprite (n : integer);
  37. procedure print_sprite (n,x,y,e,m : integer);
  38. procedure move_sprite (n,x,y : integer);
  39. procedure sprite_pos (n : integer ; var x,y : integer);
  40. function sprite_kol (n : integer) : boolean;
  41.  
  42. implementation
  43.  
  44. function nummer_ok(n : integer) : boolean;
  45. begin
  46. if (n<0) or (n>max_sprites-1) then nummer_ok:=false else nummer_ok:=true;
  47. end;
  48.  
  49. function koords_ok(x,y,dx,dy : integer) : boolean;
  50. begin
  51. if (x<0) or (y<0) or (x+dx-1>getmaxx) or (y+dy-1>getmaxy) then koords_ok:=false
  52. else koords_ok:=true;
  53. end;
  54.  
  55. function extras_ok(e,m : integer) : boolean;
  56. begin
  57. if (e<0) or (e>3) or (m<0) or (m>4) then extras_ok:=false
  58. else extras_ok:=true;
  59. end;
  60.  
  61. function grafik_aktiv : boolean;
  62. var dummy : integer;
  63. begin
  64. dummy:=getgraphmode;
  65. if graphresult=0 then grafik_aktiv:=true else grafik_aktiv:=false;
  66. end;
  67.  
  68. function match(n,m : integer) : boolean;
  69. var exu,exo,eyu,eyo : integer;
  70. begin
  71. match:=false;
  72. exu:=sprite_feld[m].x_pos+sprite_feld[m].x_gr-1;
  73. exo:=sprite_feld[n].x_pos+sprite_feld[n].x_gr-1;
  74. if ((exu-exo)>-sprite_feld[n].x_gr) and ((exu-exo)<sprite_feld[m].x_gr) then
  75. begin
  76.    eyu:=sprite_feld[m].y_pos+sprite_feld[m].y_gr-1;
  77.    eyo:=sprite_feld[n].y_pos+sprite_feld[n].y_gr-1;
  78.    if (eyu-eyo)>-sprite_feld[n].y_gr then
  79.    if (eyu-eyo)<sprite_feld[m].y_gr then match:=true
  80.    end;
  81. end;
  82.  
  83. function daten_retten(x,y,dx,dy,mem : word ; var savep : pointer) : integer;
  84. begin
  85. if memavail-4096 < mem then daten_retten:=-5 else begin
  86.    getmem(savep,mem);
  87.    getimage(x,y,x+dx-1,y+dy-1,savep^);
  88.    daten_retten:=0;
  89.    end;
  90. end;
  91.  
  92. procedure transfer_sprite(var nummer : integer ; konvert : boolean);
  93. var count,t,u : integer;
  94. begin
  95. count:=-1;
  96. repeat inc(count) until sprite_feld[count].frei or (count=max_sprites-1);
  97. if sprite_feld[count].frei then with sprite_feld[count] do begin
  98.    x_gr:=sprite_daten[2];
  99.    y_gr:=sprite_daten[3];
  100.    memuse:=imagesize(1,1,x_gr,y_gr);
  101.    if not konvert then if memuse<>n_image_size then begin
  102.       nummer:=-11;
  103.       exit;
  104.       end;
  105.    if memavail-4096 < memuse then nummer:=-5 else begin
  106.       getmem(datenp,memuse);
  107.       nummer:=daten_retten(0,0,x_gr,y_gr,memuse,savep);
  108.       if nummer=0 then if konvert then begin
  109.          for t:=0 to x_gr-1 do for u:=0 to y_gr-1 do
  110.          putpixel(t,u,sprite_daten[4+t*32+u]);
  111.          getimage(0,0,x_gr-1,y_gr-1,datenp^);
  112.          putimage(0,0,savep^,0);
  113.          freemem(savep,memuse);
  114.          savep:=nil;
  115.          frei:=false;
  116.          nummer:=count;
  117.          end
  118.       else begin
  119.          for t:=0 to memuse-1 do
  120.          byte(ptr(seg(datenp^),ofs(datenp^)+t)^):=sprite_daten[t+4];
  121.          freemem(savep,memuse);
  122.          savep:=nil;
  123.          frei:=false;
  124.          nummer:=count;
  125.          end;
  126.       end;
  127.    end
  128. else nummer:=-4;
  129. end;
  130.  
  131. procedure load_sprite (fname : string ; var nummer : integer);
  132. var myfile : file;
  133.     mfsize : longint;
  134. begin
  135. sprite_error:=0;
  136. {$I-}
  137. assign(myfile,fname);
  138. reset(myfile,1);
  139. mfsize:=filesize(myfile);
  140. close(myfile);
  141. {$I+}
  142. if ioresult<>0 then sprite_error:=-2 else
  143. if (mfsize<10) or (mfsize>1028) then sprite_error:=-3;
  144. if sprite_error=0 then begin
  145.    {$I-}
  146.    assign(myfile,fname);
  147.    reset(myfile,mfsize);
  148.    blockread(myfile,sprite_daten[0],1);
  149.    close(myfile);
  150.    {$I+}
  151.    end;
  152. if ioresult<>0 then sprite_error:=-2;
  153. if (sprite_daten[0]<>84) or (sprite_daten[1]<>83) then sprite_error:=-3;
  154. if sprite_error=0 then begin
  155.    if mfsize=1028 then begin
  156.       if not grafik_aktiv then sprite_error:=-1 else begin
  157.          transfer_sprite(nummer,true);
  158.          if nummer<0 then sprite_error:=nummer;
  159.          end;
  160.       end
  161.    else begin
  162.       if not grafik_aktiv then sprite_error:=-1 else begin
  163.          n_image_size:=mfsize-4;
  164.          transfer_sprite(nummer,false);
  165.          if nummer<0 then sprite_error:=nummer;
  166.          end;
  167.       end;
  168.    end;
  169. end;
  170.  
  171. procedure unload_sprite(nummer : integer);
  172. begin
  173. if not nummer_ok(nummer) then sprite_error:=-6 else begin
  174.    if sprite_feld[nummer].frei then sprite_error:=-7
  175.    else with sprite_feld[nummer] do begin
  176.       freemem(datenp,memuse);
  177.       if savep<>nil then freemem(datenp,memuse);
  178.       savep:=nil;
  179.       frei:=true;
  180.       sprite_error:=0;
  181.       end;
  182.    end;
  183. end;
  184.  
  185. procedure get_koords(n : integer ; var x,y : integer ; e : integer);
  186. begin
  187. case e of
  188.    0 : ;
  189.    1 : x:=x-sprite_feld[n].x_gr+1;
  190.    2 : begin
  191.           x:=x-sprite_feld[n].x_gr+1;
  192.           y:=y-sprite_feld[n].y_gr+1;
  193.           end;
  194.    3 : y:=y-sprite_feld[n].y_gr+1
  195.    end;
  196. end;
  197.  
  198. procedure set_o_list (n,m : integer);
  199. begin
  200. if sprite_feld[m].frei=false then with sprite_feld[m] do begin
  201.    if savep<>nil then if n<>m then if match(n,m) then
  202.    if o_list[n]=0 then begin
  203.       inc(o_nr);
  204.       o_list[n]:=o_nr;
  205.       s_list[o_nr]:=n;
  206.       end;
  207.    end;
  208. end;
  209.  
  210. procedure clear_o_list (n : integer);
  211. var t,u: integer;
  212. begin
  213. for t:=0 to max_sprites-1 do
  214. if sprite_feld[t].frei=false then if n<>t then with sprite_feld[t] do begin
  215.    if savep<>nil then if o_list[n]>0 then begin
  216.       u:=o_list[n];
  217.       while (u<max_sprites-1) and (s_list[u+1]<>255) do begin
  218.          dec (o_list[s_list[u+1]]);
  219.          s_list[u]:=s_list[u+1];
  220.          inc(u);
  221.          end;
  222.       o_list[n]:=0;
  223.       s_list[u]:=255;
  224.       dec(o_nr);
  225.       end;
  226.    end;
  227. end;
  228.  
  229. procedure show_sprite (n,x,y,e,m : integer);
  230. var t : integer;
  231. begin
  232. if not nummer_ok(n) then sprite_error:=-6 else with sprite_feld[n] do begin
  233.    if frei=true then sprite_error:=-7 else begin
  234.       if not extras_ok(e,m) then sprite_error:=-9 else begin
  235.          get_koords(n,x,y,e);
  236.          if not koords_ok(x,y,x_gr,y_gr) then sprite_error:=-8 else begin
  237.             if savep<>nil then freemem(savep,memuse);
  238.             sprite_error:=daten_retten(x,y,x_gr,y_gr,memuse,savep);
  239.             if sprite_error=0 then begin
  240.                putimage(x,y,datenp^,m);
  241.                x_pos:=x;
  242.                y_pos:=y;
  243.                e_merk:=e;
  244.                m_merk:=m;
  245.                o_nr:=0;
  246.                for t:=0 to max_sprites-1 do begin
  247.                    o_list[t]:=0;
  248.                    s_list[t]:=255;
  249.                    set_o_list(n,t)
  250.                    end;
  251.                end;
  252.             end;
  253.          end;
  254.       end;
  255.    end;
  256. end;
  257.  
  258. procedure review_sprite (n,s : integer);
  259. var t : integer;
  260. begin
  261. if hide_list[n]=s then with sprite_feld[n] do begin
  262.    hide_list[n]:=255;
  263.    sprite_error:=daten_retten(x_pos,y_pos,x_gr,y_gr,memuse,savep);
  264.    if sprite_error=0 then begin
  265.       putimage(x_pos,y_pos,datenp^,m_merk);
  266.       if o_nr>0 then for t:=1 to o_nr do review_sprite(s_list[t],n);
  267.       end;
  268.    end;
  269. end;
  270.  
  271. procedure unview_sprite(n,s : integer);
  272. var t : integer;
  273. begin
  274. if hide_list[n]=255 then with sprite_feld[n] do begin
  275.    hide_list[n]:=s;
  276.    if o_nr>0 then for t:=o_nr downto 1 do unview_sprite(s_list[t],n);
  277.    putimage(x_pos,y_pos,savep^,0);
  278.    freemem(savep,memuse);
  279.    savep:=nil;
  280.    end;
  281. end;
  282.  
  283. procedure hide_sprite(n : integer);
  284. var t : integer;
  285. begin
  286. if not nummer_ok(n) then sprite_error:=-6 else begin
  287.    if sprite_feld[n].frei then sprite_error:=-7
  288.    else with sprite_feld[n] do begin
  289.       if savep=nil then sprite_error:=-10 else begin
  290.          for t:=0 to max_sprites-1 do hide_list[t]:=255;
  291.          if o_nr>0 then for t:=o_nr downto 1 do unview_sprite(s_list[t],n);
  292.          putimage(x_pos,y_pos,savep^,0);
  293.          freemem(savep,memuse);
  294.          savep:=nil;
  295.          clear_o_list(n);
  296.          if o_nr>0 then for t:=1 to o_nr do review_sprite(s_list[t],n);
  297.          sprite_error:=0;
  298.          end;
  299.       end;
  300.    end;
  301. end;
  302.  
  303. procedure print_sprite (n,x,y,e,m : integer);
  304. var t : integer;
  305. begin
  306. if not nummer_ok(n) then sprite_error:=-6 else with sprite_feld[n] do begin
  307.    if frei=true then sprite_error:=-7 else begin
  308.       if not extras_ok(e,m) then sprite_error:=-9 else begin
  309.          get_koords(n,x,y,e);
  310.          if not koords_ok(x,y,x_gr,y_gr) then sprite_error:=-8 else begin
  311.             sprite_error:=0;
  312.             putimage(x,y,datenp^,m);
  313.             end;
  314.          end;
  315.       end;
  316.    end;
  317. end;
  318.  
  319. procedure move_sprite (n,x,y : integer);
  320. var t,u : integer;
  321. begin
  322. hide_sprite(n);
  323. if sprite_error=0 then with sprite_feld[n] do begin
  324.    show_sprite(n,x,y,e_merk,m_merk);
  325.    if sprite_error<>0 then begin
  326.       case e_merk of
  327.          0 : ;
  328.          1 : x:=x_pos+x_gr-1;
  329.          2 : begin
  330.                 x:=x_pos+x_gr-1;
  331.                 y:=y_pos+y_gr-1;
  332.                 end;
  333.          3 : y:=y_pos+y_gr-1
  334.          end;
  335.       show_sprite(n,x_pos,y_pos,e_merk,m_merk);
  336.       end;
  337.    end;
  338. end;
  339.  
  340. procedure sprite_pos(n : integer ; var x,y : integer);
  341. begin
  342. if not nummer_ok(n) then sprite_error:=-6 else begin
  343.    if sprite_feld[n].frei then sprite_error:=-7 else with sprite_feld[n] do
  344.    if savep=nil then sprite_error:=-10 else begin
  345.       x:=x_pos;
  346.       y:=y_pos;
  347.       case e_merk of
  348.          0 : ;
  349.          1 : x:=x+x_gr-1;
  350.          2 : begin
  351.                 x:=x+x_gr-1;
  352.                 y:=y+y_gr-1;
  353.                 end;
  354.          3 : y:=y+y_gr-1
  355.          end;
  356.       sprite_error:=0;
  357.       end;
  358.    end;
  359. end;
  360.  
  361. function sprite_kol(n : integer) : boolean;
  362. var t : integer;
  363. begin
  364. if not nummer_ok(n) then sprite_error:=-6 else begin
  365.    if sprite_feld[n].frei then sprite_error:=-7 else
  366.    if sprite_feld[n].savep=nil then sprite_error:=-10 else begin
  367.       sprite_kol:=false;
  368.       for t:=0 to max_sprites-1 do begin
  369.           kol_list[t]:=false;
  370.           if not sprite_feld[t].frei then if sprite_feld[t].savep<>nil then
  371.           if sprite_feld[t].o_list[n]>0 then begin
  372.              sprite_kol:=true;
  373.              kol_list[t]:=true;
  374.              end;
  375.           end;
  376.       if sprite_feld[n].o_nr>0 then with sprite_feld[n] do begin
  377.          sprite_kol:=true;
  378.          for t:=1 to o_nr do kol_list[s_list[t]]:=true;
  379.          end;
  380.       sprite_error:=0;
  381.       end;
  382.    end;
  383. end;
  384.  
  385. begin
  386. for init_count:=0 to max_sprites-1 do begin
  387.     sprite_feld[init_count].frei:=true;
  388.     sprite_feld[init_count].savep:=nil;
  389.     end;
  390. end.